<?php

namespace app\common\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Exception;

class Cron extends Command
{

    protected function configure(){
        $this->setName('cron')->setDescription("计划任务 Crontab");
    }

    protected function execute(Input $input, Output $output){
        //$output->writeln('Date Crontab job start...');
        /*** 这里写计划任务列表集 START ***/

        $this->doCron();

        /*** 这里写计划任务列表集 END ***/
        //$output->writeln('Date Crontab job end...');
    }

    public function doCron()
    {
        // 记录开始运行的时间
        $GLOBALS['_beginTime'] = microtime(TRUE);

        // 永不超时
        ini_set('max_execution_time', 0);
        $time   = time();
        $exe_method = [];
        $crond = config('crond');
        $crond_list = $crond['crond_list'];
        $sys_crond_timer = $crond['crond_timer'];
        foreach ($sys_crond_timer as $format) {
            $key = date($format, ceil($time));

            if(isset($crond_list[$key])){
                if (is_array(@$crond_list[$key])) {
                    $exe_method = array_merge($exe_method, $crond_list[$key]);
                }
            }
        }

        if (!empty($exe_method)) {
            foreach ($exe_method as $method) {
                if(!is_callable($method)) {
                    // 方法不存在的话就跳过不执行
                    continue;
                }

                trace("执行crond --- {$method}()\n",'info');

                $runtime_start = microtime(true);

                // 执行 Cron 文件
                call_user_func($method);

                $runtime = microtime(true) - $runtime_start;

                trace("{$method}(), 执行时间: {$runtime}",'info');
            }

            $time_total = microtime(true) - $GLOBALS['_beginTime'];
            trace("total:{$time_total}",'info');
        }
    }

}